package br.com.virtual.relatorio.service.impl;

import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.inject.Inject;

import br.com.virtual.cadastrar.model.Produto;
import br.com.virtual.relatorio.dao.impl.RelatorioVendasDAOImpl;
import br.com.virtual.relatorio.model.Periodo;
import br.com.virtual.relatorio.model.ProdutoRelatorio;
import br.com.virtual.relatorio.model.Relatorio;
import br.com.virtual.relatorio.service.RelatorioProdutoService;
import br.com.virtual.relatorio.service.RelatorioService;
import br.com.virtual.vender.model.ItemVenda;
import br.com.virtual.vender.model.Venda;

public class RelatorioProdutoServiceImpl implements RelatorioProdutoService,
		RelatorioService<ProdutoRelatorio> {

	@Inject
	RelatorioVendasDAOImpl relatorioDAO;

	@Override
	public Relatorio<ProdutoRelatorio> generate(Calendar start, Calendar end) {

		Relatorio<ProdutoRelatorio> relatorio = new Relatorio<ProdutoRelatorio>(
				new Periodo(start, end));
		List<Venda> vendas = relatorioDAO.listByPeriod(start, end);

		Map<Produto, ProdutoRelatorio> produtosVendidos = new TreeMap<Produto, ProdutoRelatorio>();

		for (Venda venda : vendas) {
			for (ItemVenda item : venda.getItens()) {

				Produto p = item.getProduto();
				
				if (produtosVendidos.containsKey(p)){
					ProdutoRelatorio produtoRelatorio = produtosVendidos.get(p);
					produtoRelatorio.setQuantidade(produtoRelatorio.getQuantidade() + item.getQuantidade());
					produtoRelatorio.setTotal(produtoRelatorio.getTotal() + item.getTotal());
				}else{
					produtosVendidos.put(p, new ProdutoRelatorio(p.getId(), p.getNome(), p.getModelo(), p.getFabricante(), item.getQuantidade(), item.getTotal(), 1));
				}
			}
		}

		
		
		
		for (ProdutoRelatorio produtoRelatorio : produtosVendidos.values()) {
			relatorio.addItem(produtoRelatorio, start, produtoRelatorio.getTotal());
		}
		
		// relatorio.addItem(produtoRelatorio, start,
		// produtoRelatorio.getTotal());

		return relatorio;
	}

}
